//1、导入切片函数
import { createSlice } from '@reduxjs/toolkit'
//导入axios
import axios from '../../utils/http'
//2、创建切片对象
let todos = createSlice({
    name: 'todolists',
    //初始化状态数据
    initialState: [],
    reducers: {
        //初始化状态数据
        inittodo: (state, { payload }) => {
            state.push(...payload);
        },
        //所有的工作方法默认都在这个切片对象里面的actions属性保存的
        //添加新任务
        addnewtodo: (state, { payload }) => {
            // console.log('载荷数据：', payload);
            state.push(payload);
        },
        //修改单条任务的选中状态
        checkonetodo: (state, { payload }) => {
            // console.log('载荷数据：', payload); //{id: 3, done: true}
            state.map(item => {
                //判断
                if (item.id === payload.id) {
                    //更新
                    item.done = payload.done;
                }
            })
        },
        //删除单条任务
        deleteonetodo: (state, { payload }) => {
            // console.log('I am coming....');
            // console.log('载荷数据：', payload);

            //数组删除方法：pop、shift、splice
            //splice有两种用法：
            //数组对象.splice(下标)：从这个下标位置开始一直删除到数组序列的末尾
            //数组对象.splice(下标,数量):从这个下标位置开始删除多少个

            state.map((item, index) => {
                if (item.id === payload) {
                    state.splice(index, 1);
                }
            })
        },
        //实现全选和反选
        checkAlltodo: (state, { payload }) => {
            // console.log('载荷数据:', payload)
            state.map(item => {
                item.done = payload;
            })
        },
        //实现清除所有已完成的任意
        clearAlltodos: (state) => {
            for (let i = 0; i < state.length; i++) {
                //获取选中项
                if (state[i].done) {
                    //逐行删除
                    state.splice(i, 1)
                    //调整下标
                    i--;
                }
            }
        }
    }
});

//针对于actions这个动作对象进行解构
export let { addnewtodo, inittodo, checkonetodo, deleteonetodo, checkAlltodo, clearAlltodos } = todos.actions;

//声明一个异步任务
//初始化请求所有的数据
export let asyncinittodos = () => {
    return async dispatch => {
        //这个函数的内部完成的就是异步任务（定时器、ajax请求）
        let { data } = await axios.get('/todolists');
        //调用动作方法，必然要通过dispatch
        dispatch(inittodo(data))
    }
}

//添加新的任务
export let asyncaddnewtodo = payload => {
    return async dispatch => {
        //post请求响应体是最新添加的那一条数据
        //post第二个参数表示的是请求体对象，注意一定是对象！！！！
        let { data } = await axios.post('/todolists', payload);
        //调用动作方法，必然要通过dispatch
        dispatch(addnewtodo(data))
    }
}

//添加一个更改单条任务的选中状态(完成状态)
export let asynccheckonetodo = payload => {
    return async dispatch => {
        //patch请求响应体响应的就是更新的那一条数据
        let { data } = await axios.patch(`/todolists/${payload.id}`, { done: payload.done });
        // console.log('更新后的单条结果对象', data);
        dispatch(checkonetodo(data))
    }
}

//添加一个删除单条任务的方法
export let asyncdeleteonetodo = payload => {
    return async dispatch => {
        //delete方法的响应体返回的是一个空对象
        await axios.delete(`/todolists/${payload}`);
        dispatch(deleteonetodo(payload))
    }
}

//添加一个全选/全不选的异步方法
export let asynccheckAlltodo = (todolists, done) => {
    return dispatch => {
        //状态数据有几条，咱们就逐一patch多少遍
        todolists.map(async item => {
            //更新数据
            await axios.patch(`/todolists/${item.id}`, { done });
            dispatch(checkAlltodo(done));
        })
    }
}

//添加一个执行清除所有已完成任务的异步方法
export let asyncclearAlltodos = todolists => {
    return dispatch => {
        todolists.filter(item => item.done).map(async item => {
            //逐一删除
            await axios.delete(`/todolists/${item.id}`);
            dispatch(clearAlltodos())
        })
    }
}


//3、暴露出来(默认暴露)
export default todos;